package com.cskaoyan.javase.oop1._15import._0one;

// import com.cskaoyan.javase.oop1._15import._1two.Student;

/**
 * one包下的Demo类,它作为一个测试类
 * 一个大前提:
 * 在Java当中,同包下绝无可能出现同名类,同包下类名是唯一性标识
 * 但是不同包下,类名相同是非常正常的事情,这时的类名就不是唯一性标识了
 *
 * 在一个类中,要想使用另外一个类,在不做任何操作的前提下
 * 直接使用类名,只可能找同包下的类,因为同包下类名是唯一的
 * 这可以看成是一种就近原则,从同包下找这个类
 * 同包中如果能够找到该类,就能正常使用
 * 如果找不到,就会编译报错
 *
 * 以上是只能使用同包类的场景,那么如果想要使用不同包下的类呢?
 * 这时最大的问题是,不同包下完全可能出现同名类
 * 那么使用不同包下的类,究竟是哪个包下的呢?
 * 如何解决这个问题呢?
 * Java代码中提供了两种解决方式:
 *      1.导包
 *          导包是通过import关键字,告诉编译器,使用的不同包下的该类,是哪个包下的
 *          语法: import 全限定类名;
 *          全限定类名 = 包名 + 类名;
 *          导包语句要紧挨着package声明,放在package声明的下面
 *          既然使用了导包语句,那么编译器就能够清晰的知道使用的是哪个包的这个类
 *          在代码中,就可以直接使用"简单类名"了
 *          导包是最常用的使用不同包下类的方式,实际开发中推荐优先选择导包.
 *
 *      2.在代码中,不选择使用简单类名,而是直接用全限定类名
 *          这个作用就和导包一样了,目的也是告诉编译器,使用的不同包下的该类,是哪个包下的.
 *          但区别是全限定类名往往都很长
 *          这就导致了代码看起来很长,很啰嗦
 *          所以能不用这种方式,就尽量不用,尽量使用导包的语法
 *
 * 扩展:
 *      什么时候要使用全限定类名直接创建对象?
 *          比如: 在本案例中,要想同时使用one和two包下的两个Student类(很少见)
 *
 * @since 11:20
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // Student s = new Student();
        // s.test();
        // new A();
        Student s = new Student();
        s.test();
        com.cskaoyan.javase.oop1._15import._1two.Student s2 = new com.cskaoyan.javase.oop1._15import._1two.Student();
        s2.test();
    }
}
